﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SharpArch.NHibernate.Contracts.Repositories;
using ADIGRE.Domain;
using ADIGRE.Infrastructure.Queries.Despesa;
using ADIGRE.Infrastructure.Queries.Pessoa;
using ADIGRE.Infrastructure.Queries.Authentication;
using ADIGRE.Infrastructure.Queries.Receita;
using ADIGRE.Infrastructure.Queries.Contabilidade;
using SharpArch.NHibernate.Web.Mvc;

namespace ADIGRE.MVC3.Web.Controllers
{
    public class ContabilidadeController : ControllerAuthorize
    {

        private readonly IAuthenticationService _authenticationService;
        private readonly IvwLivroCaixa _vwLivroCaixa;
        private readonly IPessoaQuery _PessoaQueryRepository;
        private readonly IReceitaQuery _ReceitaQueryRepository;
        private readonly IDespesaQuery _DespesaQuery;

        private readonly INHibernateRepository<Recibo> _ReciboRepository;
        private readonly INHibernateRepository<Despesa> _DespesaRepository;
        private readonly INHibernateRepository<Saida> _SaidaRepository;
        private readonly INHibernateRepository<Pagamento> _PagamentoRepository;

        private readonly INHibernateRepository<Receita> _ReceitaRepository;
        private readonly INHibernateRepository<Oferta> _OfertaRepository;
        private readonly INHibernateRepository<Entrada> _EntradaRepository;
        private readonly INHibernateRepository<Dizimo> _DizimoRepository;

        private readonly INHibernateRepository<Lancamento> _LancamentoRepository;


        public ContabilidadeController(IAuthenticationService authenticationService, INHibernateRepository<Recibo> ReciboRepository,
            IvwLivroCaixa vwLivroCaixa, IPessoaQuery PessoaQueryRepository, INHibernateRepository<Lancamento> LancamentoRepository,
            INHibernateRepository<Despesa> DespesaRepository, IDespesaQuery despesaQuery,
            INHibernateRepository<Pagamento> PagamentoRepository, INHibernateRepository<Saida> SaidaRepository,
            INHibernateRepository<Oferta> OfertaRepository, INHibernateRepository<Dizimo> _DizimoRepository, INHibernateRepository<Entrada> EntradaRepository,
            INHibernateRepository<Receita> ReceitaRepository, IReceitaQuery ReceitaQueryRepository)
        {
            this._authenticationService = authenticationService;
            this._ReciboRepository = ReciboRepository;
            this._DespesaRepository = DespesaRepository;
            this._LancamentoRepository = LancamentoRepository;
            this._SaidaRepository = SaidaRepository;
            this._PagamentoRepository = PagamentoRepository;
            this._PessoaQueryRepository = PessoaQueryRepository;
            this._DespesaQuery = despesaQuery;

            this._vwLivroCaixa = vwLivroCaixa;
            this._ReceitaRepository = ReceitaRepository;
            this._ReceitaQueryRepository = ReceitaQueryRepository;
            this._OfertaRepository = OfertaRepository;
            this._EntradaRepository = EntradaRepository;
            this._DizimoRepository = _DizimoRepository;
        }
        //
        // GET: /Lancamento/

        [Transaction]
        public ActionResult Delete(int Id, int IsEntrada)
        {
            try
            {
                var user = _authenticationService.GetUserAuthenticated();
                if (user.Pessoa != null)
                    ViewBag.UsuarioLogado = user.Pessoa.NmPessoa;
                else
                    ViewBag.UsuarioLogado = user.NmLogin;
                ViewBag.EnumPerfilAcesso = user.EnumPerfilAcesso;
                if (user.EnumPerfilAcesso.Equals(EnumPerfilAcesso.Tesoureiro))
                {
                    bool open = Convert.ToBoolean(IsEntrada);
                    if (open)
                    {
                        var entrada = _EntradaRepository.Get(Id);
                        entrada.ValidarExclusao(user);
                        _LancamentoRepository.Update(entrada);
                    }
                    else
                    {
                        var saida = _SaidaRepository.Get(Id);
                        saida.ValidarExclusao(user);
                        _LancamentoRepository.Update(saida);

                        if (!(saida.EnumLancamento.Equals(EnumLancamento.Recibo) && saida.Despesa.EnumLancamento.Equals(EnumLancamento.Pagamento)))
                            saida.Despesa.NuParcelasQuitadas--;
                        saida.Despesa.VlQuitado -= saida.VlLancamento;
                        saida.Despesa.IsEncerrado = false;
                        saida.Despesa.Validar(user);
                        _DespesaRepository.Update(saida.Despesa);
                    }
                    _Feedback = GlobalResources.Sistema.Feedback.SUCCESS_DELETE;
                }
            }
            catch (Exception ex)
            {
                _ObjLog.Error("SaidaController(Delete): " + ex.ToString());
                _Feedback = GlobalResources.Sistema.Feedback.ERROR_SYSTEM;
            }
            return RedirectToAction("LivroCaixa");
        }

        public ActionResult LivroCaixa()
        {
            try
            {
                var user = _authenticationService.GetUserAuthenticated();
                if (user.Pessoa != null)
                    ViewBag.UsuarioLogado = user.Pessoa.NmPessoa;
                else
                    ViewBag.UsuarioLogado = user.NmLogin;
                ViewBag.EnumPerfilAcesso = user.EnumPerfilAcesso;

                var anos = _LancamentoRepository.GetAll().Where(x => !x.IsExcluido).Select(x => x.DtLancamento.Value.Year).Distinct().ToList();
                ViewBag.Anos = new Util.ComboListItem().ComboAnos(anos);
                ViewBag.Meses = new Util.ComboListItem().ComboMeses();
                return View(_vwLivroCaixa.Get(new Domain.View.vwLivroCaixa().DtReferencia));
            }
            catch (Exception ex)
            {
                _ObjLog.Error("SaidaController(LivroCaixa): " + ex.ToString());
                _Feedback = GlobalResources.Sistema.Feedback.ERROR_SYSTEM;
            }
            return RedirectToAction("Index", "Home");
        }

        [HttpPost]
        public ActionResult LivroCaixa(FormCollection collection)
        {
            var Livro = new Domain.View.vwLivroCaixa();
            try
            {
                TryUpdateModel(Livro, collection);
                var user = _authenticationService.GetUserAuthenticated();
                if (user.Pessoa != null)
                    ViewBag.UsuarioLogado = user.Pessoa.NmPessoa;
                else
                    ViewBag.UsuarioLogado = user.NmLogin;
                ViewBag.EnumPerfilAcesso = user.EnumPerfilAcesso;

                var anos = _LancamentoRepository.GetAll().Where(x => !x.IsExcluido).Select(x => x.DtLancamento.Value.Year).Distinct().ToList();
                ViewBag.Anos = new Util.ComboListItem().ComboAnos(anos);
                ViewBag.Meses = new Util.ComboListItem().ComboMeses();
                Livro = _vwLivroCaixa.Get(Livro.DtReferencia);
            }
            catch (Exception ex)
            {
                _ObjLog.Error("SaidaController(LivroCaixa[]): " + ex.ToString());
                _Feedback = GlobalResources.Sistema.Feedback.ERROR_SYSTEM;
            }
            return View(Livro);
        }

        public ActionResult FechamentoMensal()
        {
            
            return View();
        }
    }
}
